package com.zelin.manager.web;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import com.zelin.entity.GoodsEntity;
import com.zelin.entity.ItemEntity;
import com.zelin.entity.group.Goods;
// import com.zelin.page.service.PageSerivce;

import com.zelin.sellergoods.service.GoodsService;
import com.zelin.sellergoods.service.ItemService;
import com.zelin.utils.PageUtils;
import com.zelin.utils.R;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.messaging.Message;
import org.springframework.messaging.converter.MessageConverter;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.web.bind.annotation.*;


/**
 * 
 *
 * @author WF
 * @email 2568783935@qq.com
 * @date 2021-07-23 21:10:35
 */
@RestController
@RequestMapping("/goods")
public class GoodsController {
    @Reference(timeout = 5000)
    private GoodsService goodsService;
    // @Reference(timeout = 5000)
    // private ItemSearchService searchService;
    @Reference(timeout = 5000)
    private ItemService itemService;
    // @Reference(timeout = 5000)
    // private PageSerivce pageSerivce;
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    /**
     * 列表
     */
    @RequestMapping("/list")
    //@RequiresPermissions("manager:goods:list")
    public R list(@RequestParam Map<String, Object> params){
        PageUtils page = goodsService.queryPage(params);

        return R.ok().put("page", page);
    }

    /**
     * 功能: 批量审核数据[数据一致性同步方案一]
     * 参数:
     * 返回值: com.zelin.utils.R
     * 时间: 2021/7/30 16:11
     */
    // @RequestMapping("/updateStatus")
    // public R updateStatus(Long[] ids,String status){
    //     //1. 审核商品
    //     goodsService.updateStatus(ids,status);
    //     //2. 根据商品id查询sku列表
    //     List<ItemEntity> entities =  itemService.findItemsbyGoodsId(ids);
    //     //3. 查询出tb_item表的数据并同时更新到索引库中(增量更新)
    //     if(status.equals("1") && entities.size() > 0) {
    //         searchService.updateToIndex(entities);
    //     }
    //     return R.ok();
    // }

    /**
     * 功能: 批量审核数据[数据一致性同步方案二: 使用消息中间件]
     * 参数:
     * 返回值: com.zelin.utils.R
     * 时间: 2021/7/30 16:11
     */
    @RequestMapping("updateStatus")
    public R updateStatus(Long[] ids,String status){
        //1. 审核商品
        goodsService.updateStatus(ids,status);
        //2. 根据商品id查询sku列表
        List<ItemEntity> entities =  itemService.findItemsbyGoodsId(ids);
        //3. 将商品列表包装成字符串发送出去
        if(entities != null && entities.size() > 0) {
            jmsMessagingTemplate.convertAndSend("updateStatus", JSON.toJSONString(entities));
        }else{
            return R.error().put("msg","没有要审核的商品！");
        }
        return R.ok();
    }

    /**
     * 功能:
     * 参数:
     * 返回值:
     * 时间: 2021/8/9 14:33
     */

    @RequestMapping("/info/{id}")
    //@RequiresPermissions("manager:goods:info")
    public R info(@PathVariable("id") Long id){
		GoodsEntity goods = goodsService.getById(id);

        return R.ok().put("goods", goods);
    }

    /**
     * 保存
     */
    @PostMapping(value="/save")
    public R save(@RequestBody Goods data){
        System.out.println("goods = " + data);
		goodsService.saveGoods(data);

        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    //@RequiresPermissions("manager:goods:update")
    public R update(@RequestBody GoodsEntity goods){
		goodsService.updateById(goods);
        return R.ok();
    }

    /**
     * 逻辑删除
     * 思路：
     *  ① 在删除商品时，同时删除索引库中相关sku的列表信息
     *  ② 同时删除此商品生成的静态页面
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        //1. 根据商品id删除商品（逻辑删除）
		goodsService.removeByIds(Arrays.asList(ids));
        //2. 发送消息，访问搜索服务，从索引库中删除相关的sku列表
        jmsMessagingTemplate.convertAndSend("deleteSku",Arrays.asList(ids));
        //3. 发送消息，访问页面静态化服务，从生成的静态页面中删除此相关的静态页
        jmsMessagingTemplate.convertAndSend("deletePage",Arrays.asList(ids));

        return R.ok();
    }

    /**
     * 功能: 根据商品id生成商品静态面
     * 参数:
     * 返回值:
     * 时间: 2021/8/6 14:31
     */
    // @RequestMapping("/item")
    // public void createHtml(Long goodsId) throws IOException {
    //     pageSerivce.createHtml(goodsId);
    // }


    /**
     * 功能: 根据商品id生成商品静态面[利用消息中间件发送消息]
     * 参数:
     * 返回值:
     * 时间: 2021/8/6 14:31
     */
    @RequestMapping("/item")
    public void createHtml(String goodsId) throws IOException {
        jmsMessagingTemplate.convertAndSend("createHtml",goodsId);
    }
}
